﻿#2.)多线程
#_thread和threading，_thread是低级模块，threading是高级模块
import time,threading

def createThread(target,isSt=True,isJoin=True,**kw):		
	t = threading.Thread(target=target,**kw)
	t.start()
	t.join()	
	return t

def loop ():
	print("threading %s is running .."% threading.current_thread().name)
	n= 0
	while n<5:
		n = n+1
		print('thread %s >>>%s' %(threading.current_thread().name,n))
		time.sleep(1)
	print('thread %s ended.' % threading.current_thread().name)
	
#创建线程

print('thread %s is running ...'%threading.current_thread().name)

createThread(target=loop,name="LoopThread")

'''
t = threading.Thread(target=loop,name="LoopThread")
t.start()
t.join()
'''
print('thread %s ended.'%threading.current_thread().name)

#锁;
'''
多线程和多进程最大的不同在于，多进程中，同一个变量，各自有一份拷贝存在于每个进程中，互不影响，而多线程中，
所有变量都由所有线程共享，所以，任何一个变量都可以被任何一个线程修改，因此，线程之间共享数据最大的危险在于
多个线程同时改一个变量，把内容给改乱了。
'''

#没有锁的时候 多线程会把同一个变量改乱的例子

balance = 0;
def change_it(n):
	global balance
	balance = balance + n;
	balance = balance - n;

def run_thread(n):	
	for i in range(10):
		change_it(n);

		
t1 = threading.Thread(target=run_thread,name="b1",args=(5,))
t2 = threading.Thread(target=run_thread,name="b2",args=(8,))

t1.start();
t2.start();
t1.join()
t2.join()

for i in range(100):	
	createThread(target=run_thread,name="LoopThread",args=(i,))

print('balance=',balance) #试了很多次结果还是0 正确的结果 这个例子不好

#用锁来限制多个线程同时修改

lock = threading.Lock()

def run_thread(n):	
	for i in range(10):
		lock.acquire() #遇到锁的线程才会继续执行
		try:
			change_it(n);
		finally:
			lock.release() #释放锁，这个步骤一定不能少
		

#分布式进程 --------------

#整个第十章 之后再研究 

















